#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static char *cmd_params[SUB_PROCESS_COUNT] = {"app", "ota"};
static SubProcess *sub_processes[SUB_PROCESS_COUNT];

static int is_running = 1;

static void exit_handler(int signum) {
    is_running = 0;
}

int daemon_runner_run(void)
{
    // 将当前进程变为守护进程
    // 参数1： 0：指定工作目录为系统根目录 1：指定工作目录为启动目录 
    // 参数2： 1：不自动关闭标准输入输出， 0：自动关闭标准输入输出
    daemon(0, 1);

    // 注册结束信号
    signal(SIGTERM, exit_handler);  // kill进程

    // 关闭标准输入输出
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/dev/null", O_RDWR);  // 标准输入  0
    open(LOG_FILE_PATH, O_CREAT|O_WRONLY|O_APPEND, 0644);  // 标准输出  1
    open(LOG_FILE_PATH, O_CREAT|O_WRONLY|O_APPEND, 0644);  // 标准错误输出  2

    // 初始化所有子进程对象
    for (int i = 0; i < SUB_PROCESS_COUNT; i++) {
        sub_processes[i] = daemon_sub_process_init(cmd_params[i]);
    }

    // 每隔1秒对所有子进程进行一个检查启动
    while(is_running) {
        for (int i = 0; i < SUB_PROCESS_COUNT; i++) {
            daemon_sub_process_checkStart(sub_processes[i]);
        }
        sleep(1);
    }

    //在守护进程结束前，关闭所有子进程
    for (int i = 0; i < SUB_PROCESS_COUNT; i++) {
        daemon_sub_process_stop(sub_processes[i]);
    }

    return 0;
}